#include <cassert>
[[ noreturn ]] void f() {
  throw "error";
  // OK
}
 
[[ noreturn ]] void q(int i) {
  // 若以 <= 0 的参数调用则行为未定义
  if (i > 0) {
    throw "positive";
  }
}

void g(){}
void h(){}
void i(){}
 
void f(int n) {
  void g(), h(), i();
  switch (n) {
    case 1:
    case 2:
      g();
     [[fallthrough]];
    case 3: // 落下时无警告
      h();
    case 4: // 编译器可能对落下警告
      i();
      [[fallthrough]]; // 病态，不在 case 标号前
  }
}
 
struct [[nodiscard]] error_info { };
error_info enable_missile_safety_mode(){
    return error_info();
}
void launch_missiles(){};
void test_missiles() {
   enable_missile_safety_mode(); // 编译器可能对丢弃一个 nodiscard 值警告
   launch_missiles();
}
error_info& foo(){
    return *(new error_info);
};
void f1() {
    foo(); // 不以值返回 nodiscard 类型，无警告
} 
 
 
[[maybe_unused]] void f([[maybe_unused]] bool thing1,
                        [[maybe_unused]] bool thing2)
{
   [[maybe_unused]] bool b = thing1 && thing2;
   assert(b); // 在 release 模式， assert 会被编译去除，而 b 不被使用
              // 无警告，因为它声明带 [[maybe_unused]]
} // 不使用参数 thing1 与 thing2 ，无警告

int main(){}